package com.yanggu.scala.chapater08.accompanyObject

object VisitDemo01 {

  def main(args: Array[String]): Unit = {
    //如果new对象没有形参, 那么可以省略()
    val person = new Person
    person.showInfo()
    //对于伴生对象而言, 调用方法或者字段的方式就是伴生对象名.方法名或者字段名。和Java类似
    //伴生对象名.方法名
    Person.test(person)
    //伴生对象.字段名, 获取字段的值
    println(Person.xxx)
  }

}

//当一个文件中出现了 class Person 和 object Person时
//伴生对象和伴生类必须写在同一个文件中
//1. class Person 称之为伴生类
//2. object Person 称之为伴生对象
//3. scala设计者将static拿掉，因为static并不是oop的内容，于是设计了伴生类和伴生对象的概念
//4. 在伴生类中写非静态的内容，在伴生对象写静态内容
//5. 如何理解呢？把伴生对象当成普通的类即可, 只不过只有一个对象, 而且是已经创建好的对象, 可以直接使用。
//   可以声明方法、字段、继承类等
class Person {

  var name : String = "jack"

  private val sal : Double = 9999.9

  protected  var age = 10

  var job : String = "大数据工程师"

  def showInfo(): Unit = {
    println("name = " + name + ", sal = " + sal + ", job = " + job)
  }

}

object Person {

  val xxx = 20

  def test(p : Person): Unit = {
    p.showInfo()
  }

  def testVisit(person: Person): Unit = {
    println(s"测试字段的访问权限, sal: ${person.sal}")
  }

}
